#!/bin/sh

add_chain() {
  /sbin/iptables -N $1
  /sbin/iptables -A $1 -p $2 --dport $3 -j ACCEPT
  /sbin/iptables -A in_mod -j $1
  /sbin/iptables -t nat -N $1
  /sbin/iptables -t nat -A $1 -p $2 --dport $3 -j ACCEPT
  /sbin/iptables -t nat -A pre_mod -j $1
}

del_chain() {
  /sbin/iptables -D in_mod -j $1
  /sbin/iptables -F $1
  /sbin/iptables -X $1
  /sbin/iptables -t nat -D pre_mod -j $1
  /sbin/iptables -t nat -F $1
  /sbin/iptables -t nat -X $1
}

get_port_info() {
  case "$1" in
    1)
      local NAME=$(status -v ports | grep -e "Expansion Port [1 ]" | grep -o -e "RS-[0-9]\{3\}")
      RETVAL=$?
      if [ $RETVAL = 0 ]; then echo "Expansion port 1 ($NAME)"; fi
      return $RETVAL
    ;;
    2)
      local NAME=$(status -v ports | grep -e "Expansion Port 2" | grep -o -e "RS-[0-9]\{3\}")
      RETVAL=$?
      if [ $RETVAL = 0 ]; then echo "Expansion port 2 ($NAME)"; fi
      return $RETVAL
    ;;
    3)
      if [ -f /usr/sbin/uportd ]; then
        echo -n "USB Port (USB-Serial Convertor "
        if [ -f /sys/bus/usb-serial/devices/ttyUSB0 ]; then echo "connected)"; else echo "unavailable now)"; fi
        return 0
      else
        return 1
      fi
    ;;
  esac
  return 1
}

show_running() {
  ps | grep -q "[r]tuMapd $1"
  local RETVAL=$?
  echo -n "Deamon $MOD_NAME for $2 is "
  if [ $RETVAL = 0 ]; then echo "running"; else echo "stopped"; fi
  return $RETVAL
}

MOD_NAME=rtuMap
MOD_DAEMON=rtuMapd
MOD_BIN=/opt/$MOD_NAME/bin/$MOD_DAEMON
MOD_CHAIN=mod_rtuMap
MOD_DEFAULTS=/opt/$MOD_NAME/etc/defaults
MOD_SETTINGS=/opt/$MOD_NAME/etc/settings
[ -L "$MOD_SETTINGS" ] && MOD_SETTINGS=`readlink $MOD_SETTINGS`

[ -f "$MOD_SETTINGS" ] || cp $MOD_DEFAULTS $MOD_SETTINGS
[ -x "/sbin/hash_verify" ] && [ ! -f "$MOD_SETTINGS.hash" ] && cp $MOD_DEFAULTS.hash $MOD_SETTINGS.hash

. $MOD_SETTINGS

case "$1" in

  start|restart)
    [ -x "/sbin/hash_verify" ] && ! hash_verify $MOD_SETTINGS && exit 1
    if [ "$1" = "restart" ]; then
      echo -n "Restarting module $MOD_NAME: "
      killall $MOD_DAEMON 2>/dev/null
      del_chain $MOD_CHAIN 2>/dev/null
    else
      echo -n "Starting module $MOD_NAME: "
    fi
    if [ "$MOD_RTUMAP_ENABLED" != "1" -a "$MOD_RTUMAP2_ENABLED" != "1" -a "$MOD_RTUMAP3_ENABLED" != "1" ]; then
      echo "skipped"
      exit 0
    fi
    RETVAL=1
    if [ "$MOD_RTUMAP_ENABLED" = "1" ]; then
      add_chain $MOD_CHAIN tcp $MOD_RTUMAP_PORT 2>/dev/null
      $MOD_BIN 1 &
      RETVAL=$(($RETVAL & $?))
    fi
    if [ "$MOD_RTUMAP2_ENABLED" = "1" ]; then
      add_chain $MOD_CHAIN tcp $MOD_RTUMAP2_PORT 2>/dev/null
      $MOD_BIN 2 &
      RETVAL=$(($RETVAL & $?))
    fi
    if [ "$MOD_RTUMAP3_ENABLED" = "1" ]; then
      add_chain $MOD_CHAIN tcp $MOD_RTUMAP3_PORT 2>/dev/null
      $MOD_BIN 3 &
      RETVAL=$(($RETVAL & $?))
    fi
    if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
    exit $RETVAL
  ;;

  stop)
    echo -n "Stopping module $MOD_NAME: "
    killall $MOD_DAEMON 2>/dev/null
    del_chain $MOD_CHAIN 2>/dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
    exit $RETVAL
  ;;

  status)
    RETVAL=1
    for PORT in 1 2 3; do
      INFO=$(get_port_info $PORT)
      if [ $? = 0 ]; then
        if show_running $PORT "$INFO"; then RETVAL=0; fi
      fi
    done
    exit $RETVAL
  ;;

  defaults)
    cp $MOD_DEFAULTS $MOD_SETTINGS 2>/dev/null
    [ -f "$MOD_DEFAULTS.hash" ] && cp $MOD_DEFAULTS.hash $MOD_SETTINGS.hash
    exit 0
  ;;

  *)
    echo "Usage: $0 {start|stop|restart|status|defaults}"
    exit 1
  ;;

esac
